#include <ispis.h>
#include <vrijeme.h>
#include <jezgra/razno.h>

//funkcije su napravljene imajuci u vidu samo jednu dretvu u sustavu!!!


int postavi_alarm_pr (	int id, vrijeme_t koliko, void (*obrada)(void *),
			void *param, uint32 zast)
{
	alarm_t p;
	
	p.id = id;
	p.kada = koliko;
	p.obrada = obrada;
	p.param = param;
	p.zast = zast;

	return j_alarm_postavi(&p);
}

int postavi_alarm (	int id, vrijeme_t koliko, void (*obrada)(void *),
			void *param, bool ponavljaj)
{
	int zast = 0;
	
	if (!id)
		zast = STVORINOVI;
	if (ponavljaj)
		zast |= PERIODICKI;

	return postavi_alarm_pr(id, koliko, obrada, param, zast);
}

int obrisi_alarm (int id)
{
	return j_alarm_obrisi(&id);
}

//interna pomocna funkcija koja se zove po isteku alarma (za donje dvije funk.)
static void alarm_istekao (void *p)
{
	int *x = p;
	
	*x = 1;
}

int odgodi (vrijeme_t koliko)
{
	int id;
	volatile int x = 0;
	//'volatile' kaze prevoditelju da ne drzi varijablu u registru, da se 
	//ona moze promijeniti i negdje drugdje (da pripazi na optimizaciju)
	
	id = postavi_alarm_pr(0, koliko, alarm_istekao, (void *) &x, 
				STVORINOVI | BLOKIRAJDR);
	if (id < 0)
		return id;
	
	while (x == 0) //ceka da se x poveca
		j_zaustavi();
	
	return obrisi_alarm(id);
}

int odgodi_do (vrijeme_t koliko)
{
	int id;
	volatile int x = 0;
	
	id = postavi_alarm_pr(0, koliko, alarm_istekao, (void *) &x, 
				ABSVRIJEME | STVORINOVI | BLOKIRAJDR);
	if (id < 0)
		return id;
	
	while (!x) //ceka da se x poveca
		j_zaustavi();
	
	return obrisi_alarm(id);
}
